#include "MenuEstadisticasRecordsPorJugadores.h"
#include <math.h>

MenuEstadisticasRecordsPorJugadores::MenuEstadisticasRecordsPorJugadores(){

}


MenuEstadisticasRecordsPorJugadores::MenuEstadisticasRecordsPorJugadores(SDL_Surface* v){
	this->ventana = v;
	opcionActual = 0;
	this->sonido = new Sonido();
	listaUsuarios = NULL;
	cantidadUsuarios = 0;
	opcionActualMenu1 = 0;
	opcionActualMenu2 = 0;
	usuario1 = NULL;
	usuario2 = NULL;
	dibujarComparacion = false;
}

void MenuEstadisticasRecordsPorJugadores::OnKeyUp(SDLKey sym, SDLMod mod, Uint16 unicode) {
	dibujarOpciones();
}

void MenuEstadisticasRecordsPorJugadores::OnKeyDown(SDLKey sym, SDLMod mod, Uint16 unicode) {
	switch(sym){
		case SDLK_DOWN:
			opcionActualMenu2 += (opcionActualMenu2!=(cantidadUsuarios-1))?1:0;
			break;
		case SDLK_UP:
			opcionActualMenu2 -= (opcionActualMenu2!=0)?1:0;
			break;
		case SDLK_s:
			opcionActualMenu1 += (opcionActualMenu1!=(cantidadUsuarios-1))?1:0;
			break;
		case SDLK_w:
			opcionActualMenu1 -= (opcionActualMenu1!=(0))?1:0;
			break;
		case SDLK_ESCAPE:
			Running = false;
			break;
		case SDLK_RETURN:
			IteradorLista<Usuario*> iteradorUsuarios = listaUsuarios->iterador();
			int i = 0;
			while(iteradorUsuarios.tieneSiguiente()) {
				Usuario* usuarioActual = iteradorUsuarios.siguiente();
				if (i==opcionActualMenu1) {
					usuario1 = usuarioActual;
				}
				if (i==opcionActualMenu2) {
					usuario2 = usuarioActual;
				}
				i++;
			}
			dibujarComparacion = true;
			break;
	}
}

int MenuEstadisticasRecordsPorJugadores::Partida(){
	return(0);
}



bool MenuEstadisticasRecordsPorJugadores::OnInit() {
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        return false;
    }
	dibujarOpciones();

    return true;
}


void MenuEstadisticasRecordsPorJugadores::dibujarOpciones(){
	TTF_Init();
	SDL_Color colorNormal;
	colorNormal.r=255;
	colorNormal.g=255;
	colorNormal.b=255;
	SDL_Color colorActual;
	colorActual.r=127;
	colorActual.g=127;
	colorActual.b=255;
	
	TTF_Font* font = TTF_OpenFont("font.ttf",20);
	SDL_Color c;
	SDL_Rect pos;
	//se carga la imagen de fondo
	pos.x = 0;
	pos.y = 0;
	SDL_Surface *imagenFondo = SDL_LoadBMP("MenuEstadisticasPorJugadorFondo1024x768.bmp");
	SDL_BlitSurface(imagenFondo,NULL,ventana,&pos);
	//Fin se carga la imagen de fondo
	
	pos.x=10;
	pos.y=10;
	c=(opcionActual==0)?colorActual:colorNormal;
	SDL_Surface* ttf = TTF_RenderText_Solid(font,"ESC PARA VOLVER AL MENU DE ESTADISTICAS",c);
	SDL_BlitSurface(ttf,NULL,ventana,&pos);
	SDL_FreeSurface(ttf);
	
	// Titulo 1
	pos.x=250;
	pos.y=80;
	ttf = TTF_RenderText_Solid(font,"JUGADOR 1",c);
	SDL_BlitSurface(ttf,NULL,ventana,&pos);
	SDL_FreeSurface(ttf);

	// Titulo 2
	pos.x=550;
	ttf = TTF_RenderText_Solid(font,"JUGADOR 2",c);
	SDL_BlitSurface(ttf,NULL,ventana,&pos);
	SDL_FreeSurface(ttf);

	// Cargo lista de usuarios solo 1 vez
	if (listaUsuarios == NULL) {
		UsuariosDAO* usuariosDAO = UsuariosDAO::getInstancia();
		listaUsuarios = usuariosDAO->getTodosLosUsuarios();
		cantidadUsuarios = listaUsuarios->tamanio();
	}
		
	// Recorro lista de Usuarios y Dibujo sus nombres para Menu 1 y 2
	IteradorLista<Usuario*> iteradorUsuarios = listaUsuarios->iterador();
	int i=0;
	pos.y = 90;
	while(iteradorUsuarios.tieneSiguiente()){
		pos.x=250;
		pos.y+=20;
		c=(opcionActualMenu1==i)?colorActual:colorNormal;
		Usuario* usuario = iteradorUsuarios.siguiente();
		ttf = TTF_RenderText_Solid(font,usuario->getNombre().c_str(),c);
		SDL_BlitSurface(ttf,NULL,ventana,&pos);
		SDL_FreeSurface(ttf);
		pos.x=550;

		c=(opcionActualMenu2==i)?colorActual:colorNormal;
		SDL_Surface* ttf2 = TTF_RenderText_Solid(font,usuario->getNombre().c_str(),c);
		SDL_BlitSurface(ttf2,NULL,ventana,&pos);
		SDL_FreeSurface(ttf2);
		i++;
	}

	//Fin Agregado para la muestra de estadisticas
	pos.y += 30;
	//Mostrar comparacion entre usuarios
	if (dibujarComparacion) {
		UsuariosDAO* usuariosDAO = UsuariosDAO::getInstancia();
		Lista<PartidaPersistente*>* listaPartidas = usuariosDAO->getPartidasEntreUsuarios(usuario1->getNombre(),usuario2->getNombre());
		if (listaPartidas->tamanio() > 0) {
			IteradorLista<PartidaPersistente*> iteradorPartidas = listaPartidas->iterador();
			string partidasJugadas = "Partidas Jugadas: ";
			char* a = new char();
			itoa(listaPartidas->tamanio(),a,10);
			partidasJugadas.append((string)a);
			pos.x = 330;
			ttf = TTF_RenderText_Solid(font,partidasJugadas.c_str(),colorActual);
			SDL_BlitSurface(ttf,NULL,ventana,&pos);
			SDL_FreeSurface(ttf);
				
			pos.x = 30;
			pos.y = 300;
			int altura = 300;
			int indicePartida = 1;
			while(iteradorPartidas.tieneSiguiente()){
				PartidaPersistente* partida = iteradorPartidas.siguiente();
				pos.y = altura;
				string partidaNumero = "PARTIDA: ";
				char* a = new char();
				itoa(indicePartida,a,10);
				partidaNumero.append((string)a);
				ttf = TTF_RenderText_Solid(font,partidaNumero.c_str(),colorActual);
				SDL_BlitSurface(ttf,NULL,ventana,&pos);
				SDL_FreeSurface(ttf);

				pos.y += 30;
				string ganador = "Ganador: ";
				ganador.append(partida->getNombreGanador());
				ttf = TTF_RenderText_Solid(font,ganador.c_str(),colorNormal);
				SDL_BlitSurface(ttf,NULL,ventana,&pos);
				SDL_FreeSurface(ttf);

				pos.y += 30;
				string tiempoPartida = "Tiempo de Partida: ";
				itoa(partida->getTiempoPartida(),a,10);
				tiempoPartida.append((string)a);

				ttf = TTF_RenderText_Solid(font,tiempoPartida.c_str(),colorNormal);
				SDL_BlitSurface(ttf,NULL,ventana,&pos);
				SDL_FreeSurface(ttf);

				pos.y += 30;
				string puntosJugador1 = "Puntos de ";
				puntosJugador1.append(partida->getNombreJugador1());
				puntosJugador1.append(": ");
				itoa(partida->getPuntosJugador1(),a,10);
				puntosJugador1.append((string)a);

				ttf = TTF_RenderText_Solid(font,puntosJugador1.c_str(),colorNormal);
				SDL_BlitSurface(ttf,NULL,ventana,&pos);
				SDL_FreeSurface(ttf);

				pos.y += 30;
				string puntosJugador2 = "Puntos de ";
				puntosJugador2.append(partida->getNombreJugador2());
				puntosJugador2.append(": ");
				itoa(partida->getPuntosJugador2(),a,10);
				puntosJugador2.append((string)a);

				ttf = TTF_RenderText_Solid(font,puntosJugador2.c_str(),colorNormal);
				SDL_BlitSurface(ttf,NULL,ventana,&pos);
				SDL_FreeSurface(ttf);

				pos.x += 300;
				
				if (indicePartida%3 == 0) {
					//reiniciar pos.x a 30
					//siempre resetear el pos.y a la altura segun cuantos elementos hay
					pos.x = 30;
					altura += 160;
				}
				indicePartida++;
			}
			dibujarComparacion = false;
		}
		else {
			pos.x = 280;
			pos.y = 260;
			ttf = TTF_RenderText_Solid(font,"Los usuarios elegidos no tienen partidas entre ellos",colorActual);
			SDL_BlitSurface(ttf,NULL,ventana,&pos);
			SDL_FreeSurface(ttf);
		}
	}

	SDL_Flip(ventana);
	// SDL_FreeSurface(ttf);
	SDL_FreeSurface(imagenFondo);
	TTF_Quit();
}

void MenuEstadisticasRecordsPorJugadores::OnRender() {
}

void MenuEstadisticasRecordsPorJugadores::OnCleanup() {
    SDL_Quit();
}

int MenuEstadisticasRecordsPorJugadores::OnExecute() {
    if(OnInit() == false) {
        return -1;
    }

	// se carga el sonido del menu
	if(sonido != NULL){
		sonido->ejecutar("Pacman_VICTORIA_WAV_00.14.wav", 10, -1, 0);
	}
	else {
		cout << "ERROR" <<endl;
	}
	// Fin se carga el sonido del menu

    SDL_Event Event;
	
    while(Running) {
        while(SDL_PollEvent(&Event)) {
            OnEvent(&Event);
        }
    }
	
	sonido->close();

    //OnCleanup();
    return 0;
}

int MenuEstadisticasRecordsPorJugadores::OpcionElegida(){
	return(opcionActual);
}